<?php

namespace app\api\controller\sync;

use app\api\controller\Base;
use app\api\controller\mytool\Sendmessage;
use app\common\model\Sync\SyncCenter;
use app\common\model\orderhawa\HawaList;
use app\common\model\orderhawa\Hawa;
use app\common\model\orderdata\Goods;
/**
 * 接受指令时使用此方法
 */
class Syncapi extends Base
{

    /**
     * 产生jwt加密串，参考session
     */
    public function initialize()
    {
        parent::initialize();
        // self::is_login();
        // Rolepower::powerguard(203008);
    }

    /**
     * 处理同步中心发回来的消息
     * @return [type] [description]
     */
    public function returnmsg()
    {
        $id     = input('id');
        $SynMsg = input('SynMsg');
        $SynImg = input('SynImg');
        $status = input('Status');
        if (empty($status) || empty($id)) {
            return myerr('缺少数据');
        }
        $data = SyncCenter::get($id);
        if ($data['Status'] == SyncCenter::STATEOK) {
            return myerr('指令已完成');
        }
        //任务执行成功
        $data->SyncTime = date('Y-m-d H:i:s', time());
        $data->SynImg   = $SynImg;
        $data->SynMsg   = json_encode($SynMsg);
        if ($status == SyncCenter::STATEOK) {
            //任务执行成功
            $data->Status   = SyncCenter::STATEOK;
            if(empty(SYNC_SUCCESS_RECEIPT)){
                //执行成功的后续操作
                self::success_after($id,$data);
                //通知审核的人
                Sendmessage::Sync(2,$id,$data);
            }else{
                //将数据转发至处理的系统
                $sb  = SyncCenter::sapi(SYNC_SUCCESS_RECEIPT, input('post.'));
                if (empty($sb)||!$sb['code']) {
                    //执行失败
                    $msg = empty($sb['msg'])?'未知错误':$sb['msg'];
                    return myerr('转发系统出错:'. $msg );
                } 
            }
        } else if ($status == SyncCenter::STATERETURNWAIT) {
            //任务执行失败 需要处理
            $data->Status   = SyncCenter::STATERETURNWAIT;
            //通知审核的人
            Sendmessage::Sync(3,$id,$data);
        }else if ($status == SyncCenter::STATECANCEL) {
            //任务取消了
            $data->Status   = SyncCenter::STATECANCEL;
            if(!empty(SYNC_SUCCESS_RECEIPT)){
                //将数据转发至处理的系统
                $sb  = SyncCenter::sapi(SYNC_SUCCESS_RECEIPT, input('post.'));
                if (empty($sb)||!$sb['code']) {
                    //执行失败
                    $msg = empty($sb['msg'])?'未知错误':$sb['msg'];
                    return myerr('转发系统出错:'. $msg );
                } 
            }else{
                //通知审核的人
                Sendmessage::Sync(4,$id,$data);
            }
        } else {
            return myerr('参数错误');
        }
        $data->save();
        return myok();
    }
    /**
     * 执行成功后的 后置处理函数
     * @return [type] [description]
     */
    private function success_after($id,$data){
        switch ($data['Type']) {
            case '社会源收集申报':
                //将返回数据同步到系统中
                self::sync_perfect_pch($id,$data);
                break;
            case '社会源收集申报（保存模块）':
                //创建自动确认模块 手动自动在模块内由系统确认
                Synccreate::ssysb_confrim_create($id,$data);
                break;
            case '社会源收集申报（自动确认模块）':
                //将返回数据同步到系统中
               self::sync_perfect_pch($id,$data);
                break;
            case '社会源收集申报（手动确认模块）':
                //将返回数据同步到系统中
                self::sync_perfect_pch($id,$data);
                break;
            default:
                // code...
                break;
        }
    }

    // public function test(){
    //     $a = '"[{\"pch\":\"\\u738b\\u519b\\u950b-\\u6ca7\\u5b9c\\u6001\\u73af\\u4fdd-20230514-0001\",\"fwmc\":\"\\u5e9f\\u94c5\\u84c4\\u7535\\u6c60\",\"fwdm\":\"900-052-31\",\"sl\":\"0.882\"}]"';
    //     dump(json_array($a));

    //     $a = '[{"pch":"\u76d0\u5c71\u53bf\u738b\u5ef6\u660e-\u6ca7\u5b9c\u6001\u73af\u4fdd-20230509-0005","fwmc":"\u5e9f\u94c5\u84c4\u7535\u6c60","fwdm":"900-052-31","sl":"1.347"}]';
    //     dump(json_array($a));

        
    //     // dump(json_array(json_array($a)));
    // }

     /**
     * 同步中心完善批次号
     * @param  [type] $id       [同步中心id]
     * @param  array  $codedata [同步中心数据]
     * @return [type]           [description]
     */
    public static function sync_perfect_pch($id,$codedata=[]){
        $hasgoodname = false;//数据添加时是否根据货物名称添加的货物

        if(empty($codedata)){
            $codedata = SyncCenter::get($id);
        }
        if(empty($codedata['SynMsg'])){
            return serr('缺少返回数据');
        }
       
        //检查是否依据货物名称添加货物  解析发送数据，判断数据添加时是否根据货物名称进行操作
        $syncontent = json_array($codedata['SyncContent'],true);
        if(!empty($syncontent['goods'])&&!empty($syncontent['goods'][0])&&!empty($syncontent['goods'][0]['goodname'])){
            $hasgoodname = true;
        }

        //解析返回数据，判断数据中是否有批次号
        $synmsg =  json_array($codedata['SynMsg'],true);
        //检查返回数据格式
        if(empty($synmsg[0]['pch'])&&empty($synmsg[0]['fwdm'])&&empty($synmsg[0]['sl'])){
            return serr('返回数据，参数错误');
        }
        //获取危废代码
        $ordernumbers = array_column($synmsg,'fwdm');
        if(empty($ordernumbers)){
            return serr('返回数据中缺少废物代码');
        }
        //获取重复的危废代码，供后面批次号同步使用
        $unique_arr = array_unique ( $ordernumbers );
        $repeat_ordernumber = array_diff_assoc ( $ordernumbers, $unique_arr );
        //获取重复的危废名称
        $fwmc_arr = array_column($synmsg,'fwmc');
        $unique_arr = array_unique ( $fwmc_arr );
        $repeat_fwmc = array_diff_assoc ( $fwmc_arr, $unique_arr );

        //从危废表查出危废id
        $goods = Goods::where('OrderNumber','in',$ordernumbers)->field(['OrderNumber','GoodId'])->select();
        if(empty($goods)){
            return serr('没有找到对应的危废');
        }
        //获取返回数据的goodid
        foreach ($synmsg as $skey => $svalue) {
            foreach ($goods as $key => $value) {
                if($svalue['fwdm']==$value['OrderNumber']){
                    $synmsg[$skey]['GoodId'] = $value['GoodId'];
                }
            }
        }

        //获取订单数据
        $lists = Hawa::where('HawaListId',$codedata['ListId'])->select();
        if(empty($lists)){
            return serr('关联订单表没有产废数据');
        }
        //对比数据存储到表
        //通过 废物代码-》（废物服务代码是否重复/（废物名称一致/废物重量一致）） 进行检测
        foreach ($lists as $key => $value) {
            foreach ($synmsg as $skey => $svalue) {
                if($svalue['GoodId']==$value['GoodId']){
                    //判断是否存在相同危废代码 如果传过去时带有废物名称则 按照名称去寻找
                    if(!in_array($svalue['fwdm'],$repeat_ordernumber) && $hasgoodname){
                        //如果危废名称一致
                        if($svalue['fwmc']==$value['GoodName']){
                            //如果存在重复名称，判断重量是否一致
                            if(in_array($svalue['fwmc'],$repeat_fwmc)){
                                //判断重量
                                if(get_sync_xw_weight((double)$svalue['sl'])==$value['ReceiveWeight']){
                                    $value->LotNumber = $svalue['pch'];
                                    $value->save();
                                }
                            }else{
                                $value->LotNumber = $svalue['pch'];
                                $value->save();
                            }
                        }
                    }else{
                        //如果传过去时不带有废物名称则直接按货物id
                        $value->LotNumber = $svalue['pch'];
                        $value->save(); 
                    }
                }
            }
        }
        $sb = Sendmessage::Orderhawa(51,$codedata['ListId']);
        return sok('操作成功');
    }

     /**
     * 处理转发来的api
     * 先保存在转发
     * @return [type] [description]
     */
    public static function receipt_create()
    {
        if(empty(SYNC_SUCCESS_RECEIPT)){
            return myerr('没有权限增加');
        }
        $data =input('post.');
        if(empty($data)){
            return myerr('缺少数据');
        }
        $type = $data['Type'];
        $sb = SyncCenter::where('Id', $data['XwcId'])->find();
        if (!empty($sb)) {
            return myerr('同步指令已存在,如需修改请在小微平台修改');
        }
        //保存
        $ndata = new SyncCenter;
        $ndata->allowField(true)->save($data);
        //转发
        $sb  = SyncCenter::syncapi('index/createcode', $data);
        if (!$sb['code']) {
            //执行失败
            return myerr('同步中心:'.$sb['msg']);
        }else{
            return myok($sb['msg']);
        }   
    }
}
